<?php
class User_User extends ActiveRecord {

	protected $tableName = 'user';
	public $pkName = 'ID_user';

	public $arrImageSizes = array(
	  array(
	    'width' => 50,
	    'height' => 50,
	    'alias' => 'small',
	    'is_main' => true
	  ),
	  array(
	    'width' => 100,
	    'height' => 100,
	    'alias' => 'medium'
	  )
	);
	protected $arrSettings = array('created_at' => true,  // в БД храним время создания
																 'updated_at' => true, 	// в БД храним время редактирования
																 'image' => true);			// в БД храним аватар (не забываем про атрибут класса image)
	
	protected $availableFields = array( 'ID_user', 'first_name', 'last_name', 'country_code',  'city',  'address',  'zip',  'home_phone', 'age', 'e_mail' => 'create', 'pass' => 'create', 'pass_confirmation' => 'create', 'kaptcha' => 'create');

  public function __construct($arrInitialFields = null) {
    Service_Debug::setDebug();
		parent::__construct($arrInitialFields);
		$this->validatesLengthOf = array(
		  'first_name' => array('minimum' => 2, 'maximum' => 128, 'message' => Service_Translate::getText('Имя должно состоять из 2-128 символов')),
		  'pass' => array('minimum' => 6, 'maximum' => 128, 'message' => Service_Translate::getText('Пароль введен неверно, должен состоять из 6-128 символов'), 'on' => 'create'),
		);
    $this->validatesFormatOf = array(
      'e_mail' => array('message' => Service_Translate::getText('Электронная почта заполнена неверно'), 'with' => '|^[\.\-_A-Za-z0-9]+?@[\.\-A-Za-z0-9]+?\.[A-Za-z0-9]{2,6}$|', 'on' => 'create'),
    );
    $this->validatesUniquenessOf = array(
      'e_mail' => array('message' => Service_Translate::getText('Эта электронная почта уже используется'), 'on' => 'create'),
	  );
	  $this->validatesConfirmationOf = array(
	    'pass' => array('message' => Service_Translate::getText('Пароль и его подтверждение не совпадают'), 'on' => 'create')
	  );
	  $this->validatesAcceptanceOf = array(
	    'confirm' => array('message' => Service_Translate::getText('Вы должны быть согласны с условиями'), 'on' => 'create')
	  );
	  $this->validatesAssociated = array(
      'country_code' => array('class' => 'Country', 'message' => Service_Translate::getText('Необходимо выбрать страну'), 'on' => 'update')
    );
	  $this->validatesNumericalityOf = array(
      'age' => array('message' => Service_Translate::getText('Возраст должен быть числом'), 'on' => 'update', 'allowNull' => true)
    );
     
  }
  
  /**
   * Метод вызывается перед регистрацией пользователя
   */
	public function beforeValidationOnCreate () {	
    $objSession = User_Session::instance();
    if (!isset($this->tableFields['kaptcha']) || empty($this->tableFields['kaptcha']) || ($objSession->__get('keystring')!=$this->tableFields['kaptcha'])) {
    	$error = Service_Translate::getText('Неверный код подтверждения');
      Exception_ActiveRecord::addObjectException(get_class($this), 'kaptcha', $error);
    }
	}
	
  /**
   * (non-PHPdoc)
   * @see ActiveRecord::beforeCreate()
   */
	public function beforeCreate() {
    if (isset($this->tableFields['kaptcha'])) unset($this->tableFields['kaptcha']);
    $this->tableFields['approve_code'] = md5(Service_Generate::generateWord(20)); //код для подтверждения регистрации
    $this->tableFields['pass'] = md5($this->tableFields['pass']);
  }
  

  /**
   * Метод проверяет, корректно ли введен адрес электроноой почты
   *
   * @param string $strEMail - e-mail
   */
  public static function isLoginCorrect($strLogin) {
    return preg_match("/^[A-Za-z0-9_]{3,32}$/", $strLogin);
  }

	/**
	 * Функция проверяет, существует ли данный EMail в БД
	 *
	 * @param $strEMail - строковое представление EMail
	 * @return true (если EMail присутствует в БД) или false
	 */
  public static function isEMailExist($strEMail) {
    Service_Debug::setDebug();
  	    return (self::getUserIdByEMail($strEMail)) ? true : false;  //Осуществляем SQL-запрос
  }
  
	/**
	 * Функция получает идентификатор пользователя по его eMail
	 *
	 * @param $strEMail - строковое представление EMail
	 * @return int 
	 */
  public static function getUserIdByEMail($strEMail) {
  	Service_Debug::setDebug();
  	$objDB = Service_Database::instance();//Получаем подключение к БД
    $stmt = "SELECT `ID_user` FROM `user` WHERE `e_mail` = '" . $strEMail . "'";  //формируем SQL-запрос
    return $objDB->selectSimpleField($stmt);
  	
  }

	/**
	 * Функция проверяет, существует ли данный EMail в БД
	 *
	 * @param $strEMail - строковое представление EMail
	 * @return true (если EMail присутствует в БД) или false
	 */
  public static function isLoginExist($login) {
    $objDB = Service_Database::instance();//Получаем подключение к БД
    $stmt = "SELECT `ID_user` FROM `user` WHERE `login` = '" . $login . "'";  //формируем SQL-запрос
    return (sizeof($objDB->select($stmt)) > 0) ? true : false;  //Осуществляем SQL-запрос
  }

	/**
	 * Устанавливает время последнего входа
	 */
	public static function setLoginTime() {
	  Service_Debug::setDebug();
		$objSession = User_Session::instance();
		$userId = $objSession->getUserId();
		if (!$userId) return null;
		$objDB = Service_Database::instance();//Получаем подключение к БД
	  $stmt = "UPDATE `user`
    				 SET  `login_time` = '" . Service_Date::gLocalTime2BD() . "'
    				 WHERE `user`.`ID_user` = '" . $userId . "'";
		return $objDB->query($stmt);
	}


	/**
	 * Устанавливает статус присутствия пользователя на сайте
	 *
	 * @param $status - статус пользователя
	 * @param $userId - id пользователя
	 */
	public static function setStatus($status, $userId) {
	  Service_Debug::setDebug();
		$objDB = Service_Database::instance();//Получаем подключение к БД
		$objSession = User_Session::instance();
		if (!$userId) $userId = $objSession->getUserId();
		if (!$userId) return null;
	  $stmt = "UPDATE `user`
    				 SET  `user_status` = '" . $status . "'
    				 WHERE `user`.`ID_user` = '" . $userId . "'";
	  return $objDB->query($stmt);
	}

	/**
	 * Метод устанавливает нулевой статус всем пользователям, которые не присутствуют на сайте уже 15 минут
	 */
	public static function setZeroStatusByTimeOut() {
	  Service_Debug::setDebug();
		$objDB = Service_Database::instance();//Получаем подключение к БД
		$stmt ="
		UPDATE `user`
    LEFT JOIN `session` ON `session`.`ID_user` = `user`.`ID_user`
    SET  `user_status` = 0
    WHERE (`session`.`last_impression` IS NULL) OR (`session`.`last_impression` < DATE_SUB(now(), INTERVAL 15 MINUTE));";
		return $objDB->query($stmt);
	}

	/**
	 * получение id пользователя по логину
	 *
	 * @param $login - логин пользователя
	 * @return id пользователя
	 */
	public static function getIdByLogin($login) {
	  Service_Debug::setDebug();
		$objDB = Service_Database::instance();//Получаем подключение к БД
		$stmt ="SELECT `ID_user` FROM `user` WHERE `login`='" . $login . "'";
		return $objDB->selectSimpleField($stmt);
	}

	/**
	 * Получает id пользователя
	 *
	 * @return integer id пользователя
	 */
	public static function getId() {
	  Service_Debug::setDebug();
		$objSesion = User_Session::instance();
		return $objSesion->getUserId();
	}



  /**
   * получаем логин по id
   *
   * @param integer $userId - id пользователя
   * @return string догин пользователя
   */
	public static function getUserLogin($userId) {
	  Service_Debug::setDebug();
		$objDB = Service_Database::instance();//Получаем подключение к БД
		$stmt ="SELECT `login` FROM `user` WHERE `ID_user`='" . $userId . "'";
		return $objDB->selectSimpleField($stmt);
	}

	/**
	 * Получаем логин по e-mail
	 *
	 * @param string $strEMail - e-mail
	 * @return string догин пользователя
	 */
	public static function getUserLoginByEmail($strEMail) {
	  Service_Debug::setDebug();
		$objDB = Service_Database::instance();//Получаем подключение к БД
		$stmt ="SELECT `login` FROM `user` WHERE `e_mail`='" . $strEMail . "'";
		return $objDB->selectSimpleField($stmt);
	}

	/**
	 * Получаем e-mail по id
	 *
	 * @param string $idUser - id пользователя
	 * @return string e-mail
	 */
	public static function getUserEmail($idUser) {
	  Service_Debug::setDebug();
		$objDB = Service_Database::instance();//Получаем подключение к БД
		$stmt ="SELECT `e_mail` FROM `user` WHERE `ID_user`='" . $idUser . "'";
		return $objDB->selectSimpleField($stmt);
	}

	/**
	 * Возварщает объект текущего пользователя
	 */
	public static function getUser() {
	  Service_Debug::setDebug();
	  $objSession = User_Session::instance();
	  return $objSession->getUser();
	}
	

	
	
	
	/**
	 * Добавляет пользователя в систему
	 * 
	 */
	public function signUpUser() {
		Service_Debug::setDebug();
		if (!$this->getField('login') || !$this->getField('e_mail')) return false;
		
		if (!$this->isLoginCorrect($this->getField('login'))) throw new Exception('Логин заполнен неправильно - допускаются только латинские буквы и цифры');
		if (!Service_Mail::isEMailCorrect($this->getField('e_mail'))) throw new Exception('Адрес электронной почты заполнен неверно');
		if ($this->isLoginExist($this->getField('login'))) throw new Exception('Пользователь с таким логином уже существует');
		if ($this->isEMailExist($this->getField('e_mail'))) throw new Exception('Пользователь с таким адресом электронной почты уже существует');

		
		$objDB = Service_Database::instance();//Получаем подключение к БД
		if (!$this->getField('pass')) {
			$this->setField('pass', Service_Generate::generatePassword());
		} 
		$stmt ="INSERT INTO `user` (`login`, `e_mail`, `pass`)
		VALUES ('" . $this->getField('login') . "', '" . $this->getField('e_mail') . "', '" . md5($this->getField('pass')) . "');";
		$this->id = $objDB->queryInsertAutoincrement($stmt);
		$this->setField('ID_user', $this->id);
		
		$objNotification = new User_Notification();
		$objNotification->newAccount($this->getField('e_mail'), $this->getField('login'), $this->getField('pass'));
		
		return $this->id;
	}
}
?>